{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import gzip\n",
    "from collections import defaultdict\n",
    "from keras.utils.np_utils import to_categorical\n",
    "import matplotlib.pyplot as plt\n",
    "from keras.layers import Dense, LSTM, Embedding\n",
    "from keras.models import Sequential\n",
    "from keras.preprocessing.text import Tokenizer,text_to_word_sequence\n",
    "\n",
    "from keras.utils.np_utils import to_categorical\n",
    "from keras.preprocessing.sequence import pad_sequences"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "vocab_size = 400000\n",
    "embedding_size = 50\n",
    "maxlen = 10\n",
    "embeddings_path = 'glove.6B.50d.txt.gz'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from sklearn.cross_validation import train_test_split\n",
    "\n",
    "df = pd.read_csv('Consumer_Complaints.csv', encoding='latin-1')\n",
    "df = df[pd.notnull(df['Consumer complaint narrative'])]\n",
    "train, test  = train_test_split( df, test_size=0.20, random_state=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(196834, 18)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(49209, 18)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Date received</th>\n",
       "      <th>Product</th>\n",
       "      <th>Sub-product</th>\n",
       "      <th>Issue</th>\n",
       "      <th>Sub-issue</th>\n",
       "      <th>Consumer complaint narrative</th>\n",
       "      <th>Company public response</th>\n",
       "      <th>Company</th>\n",
       "      <th>State</th>\n",
       "      <th>ZIP code</th>\n",
       "      <th>Tags</th>\n",
       "      <th>Consumer consent provided?</th>\n",
       "      <th>Submitted via</th>\n",
       "      <th>Date sent to company</th>\n",
       "      <th>Company response to consumer</th>\n",
       "      <th>Timely response?</th>\n",
       "      <th>Consumer disputed?</th>\n",
       "      <th>Complaint ID</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>472832</th>\n",
       "      <td>05/15/2015</td>\n",
       "      <td>Mortgage</td>\n",
       "      <td>FHA mortgage</td>\n",
       "      <td>Loan modification,collection,foreclosure</td>\n",
       "      <td>NaN</td>\n",
       "      <td>I am the sister and filing the complaint again...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Dovenmuehle Mortgage, Inc.</td>\n",
       "      <td>FL</td>\n",
       "      <td>344XX</td>\n",
       "      <td>Older American</td>\n",
       "      <td>Consent provided</td>\n",
       "      <td>Web</td>\n",
       "      <td>05/15/2015</td>\n",
       "      <td>Closed with explanation</td>\n",
       "      <td>Yes</td>\n",
       "      <td>No</td>\n",
       "      <td>1378362</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>603094</th>\n",
       "      <td>11/23/2015</td>\n",
       "      <td>Mortgage</td>\n",
       "      <td>Conventional adjustable mortgage (ARM)</td>\n",
       "      <td>Application, originator, mortgage broker</td>\n",
       "      <td>NaN</td>\n",
       "      <td>About a month ago, I inquired about the HARP p...</td>\n",
       "      <td>Company believes it acted appropriately as aut...</td>\n",
       "      <td>Ditech Financial LLC</td>\n",
       "      <td>CA</td>\n",
       "      <td>928XX</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Consent provided</td>\n",
       "      <td>Web</td>\n",
       "      <td>11/23/2015</td>\n",
       "      <td>Closed with explanation</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Yes</td>\n",
       "      <td>1668791</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>899867</th>\n",
       "      <td>11/20/2017</td>\n",
       "      <td>Debt collection</td>\n",
       "      <td>Credit card debt</td>\n",
       "      <td>Written notification about debt</td>\n",
       "      <td>Didn't receive notice of right to dispute</td>\n",
       "      <td>Creditor did provide information on how to dis...</td>\n",
       "      <td>Company has responded to the consumer and the ...</td>\n",
       "      <td>BANK OF AMERICA, NATIONAL ASSOCIATION</td>\n",
       "      <td>CA</td>\n",
       "      <td>907XX</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Consent provided</td>\n",
       "      <td>Web</td>\n",
       "      <td>11/22/2017</td>\n",
       "      <td>Closed with explanation</td>\n",
       "      <td>Yes</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2733996</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>596705</th>\n",
       "      <td>02/22/2016</td>\n",
       "      <td>Debt collection</td>\n",
       "      <td>Credit card</td>\n",
       "      <td>Communication tactics</td>\n",
       "      <td>Frequent or repeated calls</td>\n",
       "      <td>The account is over the Statutes of Limitation...</td>\n",
       "      <td>Company chooses not to provide a public response</td>\n",
       "      <td>BANK OF AMERICA, NATIONAL ASSOCIATION</td>\n",
       "      <td>NY</td>\n",
       "      <td>104XX</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Consent provided</td>\n",
       "      <td>Web</td>\n",
       "      <td>02/22/2016</td>\n",
       "      <td>Closed with explanation</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Yes</td>\n",
       "      <td>1797211</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>445194</th>\n",
       "      <td>04/24/2015</td>\n",
       "      <td>Debt collection</td>\n",
       "      <td>Payday loan</td>\n",
       "      <td>Improper contact or sharing of info</td>\n",
       "      <td>Talked to a third party about my debt</td>\n",
       "      <td>We received a phone call from XXXX from someon...</td>\n",
       "      <td>Company believes complaint caused principally ...</td>\n",
       "      <td>Advance America, Cash Advance Centers, Inc.</td>\n",
       "      <td>VA</td>\n",
       "      <td>224XX</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Consent provided</td>\n",
       "      <td>Web</td>\n",
       "      <td>04/24/2015</td>\n",
       "      <td>Closed with explanation</td>\n",
       "      <td>Yes</td>\n",
       "      <td>No</td>\n",
       "      <td>1345210</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Date received          Product                             Sub-product  \\\n",
       "472832    05/15/2015         Mortgage                            FHA mortgage   \n",
       "603094    11/23/2015         Mortgage  Conventional adjustable mortgage (ARM)   \n",
       "899867    11/20/2017  Debt collection                        Credit card debt   \n",
       "596705    02/22/2016  Debt collection                             Credit card   \n",
       "445194    04/24/2015  Debt collection                             Payday loan   \n",
       "\n",
       "                                           Issue  \\\n",
       "472832  Loan modification,collection,foreclosure   \n",
       "603094  Application, originator, mortgage broker   \n",
       "899867           Written notification about debt   \n",
       "596705                     Communication tactics   \n",
       "445194       Improper contact or sharing of info   \n",
       "\n",
       "                                        Sub-issue  \\\n",
       "472832                                        NaN   \n",
       "603094                                        NaN   \n",
       "899867  Didn't receive notice of right to dispute   \n",
       "596705                 Frequent or repeated calls   \n",
       "445194      Talked to a third party about my debt   \n",
       "\n",
       "                             Consumer complaint narrative  \\\n",
       "472832  I am the sister and filing the complaint again...   \n",
       "603094  About a month ago, I inquired about the HARP p...   \n",
       "899867  Creditor did provide information on how to dis...   \n",
       "596705  The account is over the Statutes of Limitation...   \n",
       "445194  We received a phone call from XXXX from someon...   \n",
       "\n",
       "                                  Company public response  \\\n",
       "472832                                                NaN   \n",
       "603094  Company believes it acted appropriately as aut...   \n",
       "899867  Company has responded to the consumer and the ...   \n",
       "596705   Company chooses not to provide a public response   \n",
       "445194  Company believes complaint caused principally ...   \n",
       "\n",
       "                                            Company State ZIP code  \\\n",
       "472832                   Dovenmuehle Mortgage, Inc.    FL    344XX   \n",
       "603094                         Ditech Financial LLC    CA    928XX   \n",
       "899867        BANK OF AMERICA, NATIONAL ASSOCIATION    CA    907XX   \n",
       "596705        BANK OF AMERICA, NATIONAL ASSOCIATION    NY    104XX   \n",
       "445194  Advance America, Cash Advance Centers, Inc.    VA    224XX   \n",
       "\n",
       "                  Tags Consumer consent provided? Submitted via  \\\n",
       "472832  Older American           Consent provided           Web   \n",
       "603094             NaN           Consent provided           Web   \n",
       "899867             NaN           Consent provided           Web   \n",
       "596705             NaN           Consent provided           Web   \n",
       "445194             NaN           Consent provided           Web   \n",
       "\n",
       "       Date sent to company Company response to consumer Timely response?  \\\n",
       "472832           05/15/2015      Closed with explanation              Yes   \n",
       "603094           11/23/2015      Closed with explanation              Yes   \n",
       "899867           11/22/2017      Closed with explanation              Yes   \n",
       "596705           02/22/2016      Closed with explanation              Yes   \n",
       "445194           04/24/2015      Closed with explanation              Yes   \n",
       "\n",
       "       Consumer disputed?  Complaint ID  \n",
       "472832                 No       1378362  \n",
       "603094                Yes       1668791  \n",
       "899867                NaN       2733996  \n",
       "596705                Yes       1797211  \n",
       "445194                 No       1345210  "
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Common methods to read data and get embeddings\n",
    "def read_data():\n",
    "    df_train = train\n",
    "    df_val = test\n",
    "    categories = list(set(df_train.Product.values))\n",
    "    return df_train,df_val,categories\n",
    "\n",
    "def load_embeddings():\n",
    "    word_index = {}\n",
    "    embeddings = np.zeros((vocab_size,embedding_size))\n",
    "    with gzip.open(embeddings_path) as file:\n",
    "        for i,line in enumerate(file):\n",
    "            line_tokens = line.split()\n",
    "            word = line_tokens[0].decode('utf8')\n",
    "            embeddings[i] = np.asarray(line_tokens[1:],dtype='float32')\n",
    "            word_index[word] = i\n",
    "    return embeddings,word_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_embedding(word,word_index,embeddings):\n",
    "    if word in word_index:\n",
    "        return embeddings[word_index[word]].reshape(((embedding_size,1)))\n",
    "    else:\n",
    "        return np.zeros((embedding_size,1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Methods for Neural Network Model\n",
    "def prepare_data(df_train,df_val,categories):\n",
    "    train_text = df_train['Consumer complaint narrative'].tolist()\n",
    "    val_text = df_val['Consumer complaint narrative'].tolist()\n",
    "    tk = Tokenizer(num_words = vocab_size, lower = True)\n",
    "    tk.fit_on_texts(train_text + val_text)\n",
    "    x_train = pad_sequences(tk.texts_to_sequences(train_text),maxlen=maxlen)\n",
    "    x_val = pad_sequences(tk.texts_to_sequences(val_text),maxlen=maxlen)\n",
    "    y_train = category_to_one_hot(df_train['Product'].values,categories)\n",
    "    y_val = category_to_one_hot(df_val['Product'].values,categories) \n",
    "    return tk.word_index,x_train,y_train,x_val,y_val\n",
    "\n",
    "def prepare_data_from_full_word_index(df_train,df_val,categories,word_index):\n",
    "    train_text = df_train['Consumer complaint narrative'].tolist()\n",
    "    val_text = df_val['Consumer complaint narrative'].tolist()\n",
    "    x_train = get_pad_sequences(train_text,word_index)\n",
    "    x_val = get_pad_sequences(val_text,word_index)\n",
    "    y_train = category_to_one_hot(df_train['Product'].values,categories)\n",
    "    y_val = category_to_one_hot(df_val['Product'].values,categories) \n",
    "    return word_index,x_train,y_train,x_val,y_val\n",
    "\n",
    "def get_pad_sequences(text_list,word_index):\n",
    "    seqs = []\n",
    "    for text in text_list:\n",
    "        word_seq = text_to_word_sequence(text.lower())\n",
    "        seq = []\n",
    "        for word in word_seq:\n",
    "          if word in word_index:\n",
    "            seq.append(word_index[word])\n",
    "        seqs.append(seq)\n",
    "    return pad_sequences(seqs,maxlen)\n",
    "\n",
    "\n",
    "# Convert the list of categories to one_hot vector\n",
    "def category_to_one_hot(cat_list,cat_master):\n",
    "    cat_dict = {}\n",
    "    for i,cat in enumerate(cat_master):\n",
    "        cat_dict[cat] = i\n",
    "    cat_integers = [cat_dict[cat] for cat in cat_list]\n",
    "    return to_categorical(cat_integers,num_classes=len(cat_master))\n",
    "\n",
    "# Convert one_hot to category\n",
    "def one_hot_to_category(cat_one_hot_list,cat_master):\n",
    "    return [cat_master[cat_one_hot.argmax()] for cat_one_hot in cat_one_hot_list]\n",
    "\n",
    "# Get the embedding weights for the model\n",
    "def get_embedding_matrix_for_model(embeddings,word_index):\n",
    "    train_val_words = min(vocab_size, len(word_index)) +1\n",
    "    embedding_matrix = np.zeros((train_val_words, embedding_size))\n",
    "    for word, i in word_index.items():\n",
    "        embedding_vector = get_embedding(word,word_index,embeddings).flatten()\n",
    "        if embedding_vector is not None: \n",
    "            embedding_matrix[i] = embedding_vector\n",
    "    return embedding_matrix\n",
    "\n",
    "# Build the keras model\n",
    "def build_model(embedding_matrix,categories):\n",
    "    model = Sequential()\n",
    "    model.add(Embedding(embedding_matrix.shape[0], embedding_size, weights=[embedding_matrix],input_length=maxlen,trainable=False))\n",
    "    model.add(LSTM(32))\n",
    "#   We don't lose much by replacing LSTM with this flatten layer (as we have short sequences)\n",
    "#   model.add(Flatten())\n",
    "    model.add(Dense(32, activation='relu'))\n",
    "    model.add(Dense(len(categories), activation='sigmoid'))\n",
    "    model.compile(optimizer='rmsprop',\n",
    "              loss='categorical_crossentropy',\n",
    "              metrics=['acc'])\n",
    "    return model\n",
    "\n",
    "def get_val(numerator,divisor):\n",
    "    return float('nan') if divisor == 0 else np.round(numerator/divisor,3)\n",
    "\n",
    "def analyze_predictions(categories,y_true,y_pred):\n",
    "    tp = defaultdict(int)\n",
    "    tn = defaultdict(int)\n",
    "    fp = defaultdict(int)\n",
    "    fn = defaultdict(int)\n",
    "    precisions = []\n",
    "    recalls = []\n",
    "    f1s = []\n",
    "    cat_counts = defaultdict(int)\n",
    "    for cat in y_true:\n",
    "        cat_counts[cat]+=1 \n",
    "    correct = 0\n",
    "    conf_mat = defaultdict(dict)\n",
    "    for cat1 in categories:\n",
    "        for cat2 in categories:\n",
    "            conf_mat[cat1][cat2] = 0\n",
    "    for y,y_hat in zip(y_true,y_pred):\n",
    "        conf_mat[y][y_hat]+=1\n",
    "        if y == y_hat:\n",
    "            correct+=1\n",
    "            tp[y]+=1\n",
    "        else:\n",
    "            fp[y_hat]+=1\n",
    "            fn[y]+=1\n",
    "    print('Overall Accuracy:',round(correct/len(y_pred),3))\n",
    "    for cat in categories:\n",
    "        precision = get_val(tp[cat],tp[cat]+fp[cat])\n",
    "        recall = get_val(tp[cat],(tp[cat]+fn[cat]))\n",
    "        f1 = get_val(2*precision*recall,precision + recall)\n",
    "        precisions.append(precision)\n",
    "        recalls.append(recall)  \n",
    "        f1s.append(f1)\n",
    "        print('{} --> Precision:{},Recall:{},F1:{}'.format(cat,precision,recall,f1))\n",
    "    print ('\\nAverages---> Precision:{}, Recall:{}, F1:{}'.format(np.round(np.nanmean(precisions),3),                                                                                                np.round(np.nanmean(recalls),3),\n",
    "                                                               np.round(np.nanmean(f1s),3))\n",
    "          )\n",
    "          \n",
    "    print('\\nConfusion Matrix')\n",
    "    for cat1 in categories:\n",
    "        print('\\n'  +cat1+'({}) --> '.format(cat_counts[cat1]),end='')\n",
    "        for cat2 in categories:\n",
    "            print('{}({})'.format(cat2,conf_mat[cat1][cat2]),end=' , ')\n",
    "    print('')\n",
    "    \n",
    "\n",
    "\n",
    "# From Deep Learning with Python book\n",
    "def make_history_plot(history):\n",
    "    acc = history.history['acc']\n",
    "    val_acc = history.history['val_acc']\n",
    "    loss = history.history['loss']\n",
    "    val_loss = history.history['val_loss']\n",
    "\n",
    "    epochs = range(1, len(acc) + 1)\n",
    "\n",
    "    plt.plot(epochs, acc, 'bo', label='Training acc')\n",
    "    plt.plot(epochs, val_acc, 'b', color='green',label='Validation acc')\n",
    "    plt.title('Training and validation accuracy')\n",
    "    plt.legend()\n",
    "\n",
    "    plt.figure()\n",
    "\n",
    "    plt.plot(epochs, loss, 'bo', label='Training loss')\n",
    "    plt.plot(epochs, val_loss, 'b', color='green',label='Validation loss')\n",
    "    plt.title('Training and validation loss')\n",
    "    plt.legend()\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "np.random.seed(42) # for reproducibility\n",
    "from IPython.display import SVG\n",
    "from keras.utils.vis_utils import model_to_dot\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train,df_val,categories = read_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Load Glove 50-d embeddings\n",
    "embeddings,word_index = load_embeddings()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Prepare the data for the model\n",
    "tk_word_index,x_train,y_train,x_val,y_val = prepare_data_from_full_word_index(df_train,df_val,categories,word_index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "embedding_1 (Embedding)      (None, 10, 50)            20000050  \n",
      "_________________________________________________________________\n",
      "lstm_1 (LSTM)                (None, 32)                10624     \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 32)                1056      \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 18)                594       \n",
      "=================================================================\n",
      "Total params: 20,012,324\n",
      "Trainable params: 12,274\n",
      "Non-trainable params: 20,000,050\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "# Get the embedding matrix for the model, build model, display model summary\n",
    "embedding_matrix = get_embedding_matrix_for_model(embeddings,word_index)\n",
    "model = build_model(embedding_matrix,categories)\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 196834 samples, validate on 49209 samples\n",
      "Epoch 1/5\n",
      "196834/196834 [==============================] - 96s 487us/step - loss: 2.0187 - acc: 0.3172 - val_loss: 1.9270 - val_acc: 0.3612\n",
      "Epoch 2/5\n",
      "196834/196834 [==============================] - 87s 443us/step - loss: 1.9030 - acc: 0.3718 - val_loss: 1.8884 - val_acc: 0.3762\n",
      "Epoch 3/5\n",
      "196834/196834 [==============================] - 84s 427us/step - loss: 1.8770 - acc: 0.3827 - val_loss: 1.8768 - val_acc: 0.3806\n",
      "Epoch 4/5\n",
      "196834/196834 [==============================] - 82s 418us/step - loss: 1.8639 - acc: 0.3873 - val_loss: 1.8697 - val_acc: 0.3855\n",
      "Epoch 5/5\n",
      "196834/196834 [==============================] - 91s 464us/step - loss: 1.8582 - acc: 0.3906 - val_loss: 1.8717 - val_acc: 0.3877\n"
     ]
    }
   ],
   "source": [
    "# Train the model, record history\n",
    "history = model.fit(x_train, y_train,\n",
    "                    epochs=5,\n",
    "                    batch_size=24,\n",
    "                    shuffle=False,\n",
    "                    validation_data=(x_val, y_val))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a26169908>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\ndthhFBYWMnjwYC688ELS0tLKLLNt2zYGDhzIhAkTuOmmm3j22We55ZZbDli3u/PJJ58wffp07rnn\nHmbOnMljjz1Gp06dePXVV1mwYAFZWVmVxpefn89tt93GnDlzaNu2LaeddhozZswgOTmZzZs3s3Dh\nQgC2bg2uYH/ggQdYs2YNTZs2LZkXCw3mzt0RI2D1aigqCn4q6YvUjrrsUzvmmGP40Y9+VPJ+6tSp\nZGVlkZWVxdKlS1myZMkByzRv3pwzzjgDgBNOOIHVq1eXu+4LLrjggDoffvghw4YNA6B379707Nmz\n0vg+/vhjTj31VDp06EBCQgKXXHIJs2fP5thjj2X58uXccMMNvPXWW7Rt2xaAnj17MnLkSHJycmp0\nA1ZNNZjELyJ1o6K+s9roU2vZsmXJ9IoVK3jkkUd4//33ycvLY+jQoeVez960adOS6caNG1NYWFju\nups1a3ZAneoOTFVR/fbt25OXl8fJJ5/Mo48+ylVXXQXAW2+9xbhx4/jkk0/Izs5m37591dpetCjx\ni0i1xKpPbfv27bRu3Zo2bdqwfv163nrrrahv4+STT+bll18GYOHCheV+oyitX79+zJo1iy1btlBY\nWMi0adMYOHAgBQUFuDv//u//zt133828efPYt28f+fn5nHrqqfzud7+joKCAXfu3mdWRevk8fhGp\nv2LVp5aVlUVaWhrp6ekcffTR9O/fP+rbuP7667nsssvIyMggKyuL9PT0kmaa8nTp0oV77rmHQYMG\n4e6cc845nHXWWcybN48rr7wSd8fM+O///m8KCwu55JJL2LFjB0VFRdx88820bt066p8hEvVyzN3s\n7GzXQCwidWfp0qWkpqbGOoyYKywspLCwkMTERFasWMHpp5/OihUraNKkfp0jl/f7MrO57p4dyfL1\n69OIiMTQzp07GTJkCIWFhbg7Tz31VL1L+tHQ8D6RiMhBateuHXPnzo11GLVOnbsiInFGiV9EJM4o\n8YuIxBklfhGROKPELyIxN2jQoANuyHr44Ye55pprKlgi0KpVKwDWrVvHhRdeWOG6q7o8/OGHHy5z\nM9WZZ54ZlWfp3HXXXTz44IM1Xk+0KfGLSMwNHz6cadOmlZk3bdo0hg8fHtHyRx55JK+88spBb3//\nxP/GG2/Qrl27g15ffafELyIxd+GFFzJjxgy+++47AFavXs26des4+eSTS66tz8rKolevXvzlL385\nYPnVq1eTnp4OwO7duxk2bBgZGRlcfPHF7N69u6Te1VdfXfJY5zvvvBOARx99lHXr1jF48GAGDx4M\nQEpKCps3bwbgoYceIj09nfT09JLHOq9evZrU1FR+8Ytf0LNnT04//fQy2ylPbm4u/fr1IyMjg5/9\n7Gd88803JdtPS0sjIyOj5AFxf//730sGo+nTpw87duw46H1bHl3HLyJl/Grmr8jdEN3RpTI7ZfLw\n0IcrLG/fvj19+/Zl5syZnHfeeUybNo2LL74YMyMxMZHXXnuNNm3asHnzZvr168e5555b4dizEydO\npEWLFuTl5ZGXl1fm0cr3338/hx12GPv27WPIkCHk5eXxy1/+koceeohZs2bRoUOHMuuaO3cukydP\n5uOPP8bdOfHEExk4cCBJSUmsWLGCqVOn8sc//pGLLrqIV199tdJn7F922WU89thjDBw4kDvuuIO7\n776bhx9+mAkTJrBq1SqaNWtW0rz04IMP8sQTT9C/f3927txJYmJidXZ3lXTGLyL1QunmntLNPO7O\n+PHjycjI4LTTTuOrr75i48aNFa5n9uzZJQk4IyODjIyMkrKXX36ZrKws+vTpw+LFi6t8CNuHH37I\nz372M1q2bEmrVq244IIL+Mc//gFA9+7dycwMxpWq7PHPEIwRsHXrVgYOHAjA5ZdfzuzZs0tiHDFi\nBFOmTCm5S7h///7cdNNNPProo2zdujXqdw9HMvRiV+AFoBNQBExy90f2q2PAI8CZwC5glLvPC8su\nB24Lq97n7s9HL3wRibbKzsxr0/nnn89NN93EvHnz2L17d8mZek5ODgUFBcydO5eEhARSUlLKfRxz\naeV9G1i1ahUPPvggn376KUlJSYwaNarK9VT2LLPixzpD8Gjnqpp6KvK3v/2N2bNnM336dO69914W\nL17MLbfcwllnncUbb7xBv379ePfdd+nRo8dBrb88kZzxFwK/dvdUoB9wrZml7VfnDOC48DUWmAhg\nZocBdxKMw9sXuNPMkqIUu4g0IK1atWLQoEFcccUVZTp1t23bxuGHH05CQgKzZs1iTXkDbJcyYMCA\nkkHVFy1aRF5eHhA81rlly5a0bduWjRs38uabb5Ys07p163Lb0QcMGMDrr7/Orl27+Pbbb3nttdc4\n5ZRTqv3Z2rZtS1JSUsm3hRdffJGBAwdSVFTE2rVrGTx4MA888ABbt25l586dfP755/Tq1Yubb76Z\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a26ddf320>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "make_history_plot(history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Overall Accuracy: 0.395\n",
      "Consumer Loan --> Precision:0.457,Recall:0.061,F1:0.108\n",
      "Mortgage --> Precision:0.377,Recall:0.626,F1:0.471\n",
      "Payday loan, title loan, or personal loan --> Precision:nan,Recall:0.0,F1:nan\n",
      "Money transfer, virtual currency, or money service --> Precision:nan,Recall:0.0,F1:nan\n",
      "Credit reporting, credit repair services, or other personal consumer reports --> Precision:0.374,Recall:0.304,F1:0.335\n",
      "Vehicle loan or lease --> Precision:nan,Recall:0.0,F1:nan\n",
      "Credit reporting --> Precision:0.431,Recall:0.293,F1:0.349\n",
      "Prepaid card --> Precision:nan,Recall:0.0,F1:nan\n",
      "Other financial service --> Precision:nan,Recall:0.0,F1:nan\n",
      "Credit card or prepaid card --> Precision:nan,Recall:0.0,F1:nan\n",
      "Money transfers --> Precision:nan,Recall:0.0,F1:nan\n",
      "Student loan --> Precision:0.628,Recall:0.187,F1:0.288\n",
      "Virtual currency --> Precision:nan,Recall:0.0,F1:nan\n",
      "Payday loan --> Precision:nan,Recall:0.0,F1:nan\n",
      "Bank account or service --> Precision:0.309,Recall:0.304,F1:0.306\n",
      "Checking or savings account --> Precision:nan,Recall:0.0,F1:nan\n",
      "Credit card --> Precision:0.338,Recall:0.187,F1:0.241\n",
      "Debt collection --> Precision:0.414,Recall:0.706,F1:0.522\n",
      "\n",
      "Averages---> Precision:0.416, Recall:0.148, F1:0.328\n",
      "\n",
      "Confusion Matrix\n",
      "\n",
      "Consumer Loan(7600) --> Consumer Loan(462) , Mortgage(2537) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(638) , Vehicle loan or lease(0) , Credit reporting(254) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(137) , Virtual currency(0) , Payday loan(0) , Bank account or service(330) , Checking or savings account(0) , Credit card(299) , Debt collection(2943) , \n",
      "Mortgage(32687) --> Consumer Loan(24) , Mortgage(20463) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(1773) , Vehicle loan or lease(0) , Credit reporting(580) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(377) , Virtual currency(0) , Payday loan(0) , Bank account or service(1333) , Checking or savings account(0) , Credit card(610) , Debt collection(7527) , \n",
      "Payday loan, title loan, or personal loan(1252) --> Consumer Loan(18) , Mortgage(455) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(69) , Vehicle loan or lease(0) , Credit reporting(23) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(47) , Virtual currency(0) , Payday loan(0) , Bank account or service(83) , Checking or savings account(0) , Credit card(43) , Debt collection(514) , \n",
      "Money transfer, virtual currency, or money service(1306) --> Consumer Loan(0) , Mortgage(385) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(72) , Vehicle loan or lease(0) , Credit reporting(17) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(2) , Virtual currency(0) , Payday loan(0) , Bank account or service(368) , Checking or savings account(0) , Credit card(68) , Debt collection(394) , \n",
      "Credit reporting, credit repair services, or other personal consumer reports(28704) --> Consumer Loan(112) , Mortgage(4235) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(8728) , Vehicle loan or lease(0) , Credit reporting(5492) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(176) , Virtual currency(0) , Payday loan(0) , Bank account or service(317) , Checking or savings account(0) , Credit card(599) , Debt collection(9045) , \n",
      "Vehicle loan or lease(1584) --> Consumer Loan(146) , Mortgage(518) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(143) , Vehicle loan or lease(0) , Credit reporting(48) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(22) , Virtual currency(0) , Payday loan(0) , Bank account or service(70) , Checking or savings account(0) , Credit card(66) , Debt collection(571) , \n",
      "Credit reporting(25280) --> Consumer Loan(63) , Mortgage(3430) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(5221) , Vehicle loan or lease(0) , Credit reporting(7407) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(135) , Virtual currency(0) , Payday loan(0) , Bank account or service(245) , Checking or savings account(0) , Credit card(459) , Debt collection(8320) , \n",
      "Prepaid card(1169) --> Consumer Loan(4) , Mortgage(311) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(38) , Vehicle loan or lease(0) , Credit reporting(11) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(3) , Virtual currency(0) , Payday loan(0) , Bank account or service(305) , Checking or savings account(0) , Credit card(176) , Debt collection(321) , \n",
      "Other financial service(239) --> Consumer Loan(1) , Mortgage(82) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(10) , Vehicle loan or lease(0) , Credit reporting(4) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(5) , Virtual currency(0) , Payday loan(0) , Bank account or service(33) , Checking or savings account(0) , Credit card(7) , Debt collection(97) , \n",
      "Credit card or prepaid card(6074) --> Consumer Loan(10) , Mortgage(1596) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(577) , Vehicle loan or lease(0) , Credit reporting(156) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(27) , Virtual currency(0) , Payday loan(0) , Bank account or service(737) , Checking or savings account(0) , Credit card(1117) , Debt collection(1854) , \n",
      "Money transfers(1205) --> Consumer Loan(1) , Mortgage(335) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(77) , Vehicle loan or lease(0) , Credit reporting(14) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(1) , Virtual currency(0) , Payday loan(0) , Bank account or service(353) , Checking or savings account(0) , Credit card(39) , Debt collection(385) , \n",
      "Student loan(12242) --> Consumer Loan(20) , Mortgage(5130) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(633) , Vehicle loan or lease(0) , Credit reporting(204) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(2292) , Virtual currency(0) , Payday loan(0) , Bank account or service(333) , Checking or savings account(0) , Credit card(274) , Debt collection(3356) , \n",
      "Virtual currency(14) --> Consumer Loan(0) , Mortgage(4) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(1) , Vehicle loan or lease(0) , Credit reporting(0) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(0) , Virtual currency(0) , Payday loan(0) , Bank account or service(3) , Checking or savings account(0) , Credit card(1) , Debt collection(5) , \n",
      "Payday loan(1402) --> Consumer Loan(1) , Mortgage(464) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(62) , Vehicle loan or lease(0) , Credit reporting(21) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(46) , Virtual currency(0) , Payday loan(0) , Bank account or service(94) , Checking or savings account(0) , Credit card(49) , Debt collection(665) , \n",
      "Bank account or service(11915) --> Consumer Loan(18) , Mortgage(3198) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(672) , Vehicle loan or lease(0) , Credit reporting(197) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(35) , Virtual currency(0) , Payday loan(0) , Bank account or service(3626) , Checking or savings account(0) , Credit card(857) , Debt collection(3312) , \n",
      "Checking or savings account(3793) --> Consumer Loan(5) , Mortgage(963) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(233) , Vehicle loan or lease(0) , Credit reporting(61) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(16) , Virtual currency(0) , Payday loan(0) , Bank account or service(1219) , Checking or savings account(0) , Credit card(204) , Debt collection(1092) , \n",
      "Credit card(15089) --> Consumer Loan(25) , Mortgage(3871) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(1379) , Vehicle loan or lease(0) , Credit reporting(481) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(58) , Virtual currency(0) , Payday loan(0) , Bank account or service(1556) , Checking or savings account(0) , Credit card(2826) , Debt collection(4893) , \n",
      "Debt collection(45279) --> Consumer Loan(102) , Mortgage(6279) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(3004) , Vehicle loan or lease(0) , Credit reporting(2214) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(273) , Virtual currency(0) , Payday loan(0) , Bank account or service(745) , Checking or savings account(0) , Credit card(674) , Debt collection(31988) , \n"
     ]
    }
   ],
   "source": [
    "# Make and analyze training predictions\n",
    "train_predictions = one_hot_to_category(model.predict(x_train),categories)\n",
    "analyze_predictions(categories,df_train['Product'].values,train_predictions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Overall Accuracy: 0.388\n",
      "Consumer Loan --> Precision:0.475,Recall:0.072,F1:0.125\n",
      "Mortgage --> Precision:0.373,Recall:0.625,F1:0.467\n",
      "Payday loan, title loan, or personal loan --> Precision:nan,Recall:0.0,F1:nan\n",
      "Money transfer, virtual currency, or money service --> Precision:nan,Recall:0.0,F1:nan\n",
      "Credit reporting, credit repair services, or other personal consumer reports --> Precision:0.365,Recall:0.291,F1:0.324\n",
      "Vehicle loan or lease --> Precision:nan,Recall:0.0,F1:nan\n",
      "Credit reporting --> Precision:0.407,Recall:0.282,F1:0.333\n",
      "Prepaid card --> Precision:nan,Recall:0.0,F1:nan\n",
      "Other financial service --> Precision:nan,Recall:0.0,F1:nan\n",
      "Credit card or prepaid card --> Precision:nan,Recall:0.0,F1:nan\n",
      "Money transfers --> Precision:nan,Recall:0.0,F1:nan\n",
      "Student loan --> Precision:0.603,Recall:0.187,F1:0.285\n",
      "Virtual currency --> Precision:nan,Recall:0.0,F1:nan\n",
      "Payday loan --> Precision:nan,Recall:0.0,F1:nan\n",
      "Bank account or service --> Precision:0.3,Recall:0.294,F1:0.297\n",
      "Checking or savings account --> Precision:nan,Recall:0.0,F1:nan\n",
      "Credit card --> Precision:0.333,Recall:0.186,F1:0.239\n",
      "Debt collection --> Precision:0.408,Recall:0.687,F1:0.512\n",
      "\n",
      "Averages---> Precision:0.408, Recall:0.146, F1:0.323\n",
      "\n",
      "Confusion Matrix\n",
      "\n",
      "Consumer Loan(1873) --> Consumer Loan(134) , Mortgage(647) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(158) , Vehicle loan or lease(0) , Credit reporting(69) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(41) , Virtual currency(0) , Payday loan(0) , Bank account or service(82) , Checking or savings account(0) , Credit card(56) , Debt collection(686) , \n",
      "Mortgage(8151) --> Consumer Loan(9) , Mortgage(5092) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(443) , Vehicle loan or lease(0) , Credit reporting(114) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(110) , Virtual currency(0) , Payday loan(0) , Bank account or service(344) , Checking or savings account(0) , Credit card(168) , Debt collection(1871) , \n",
      "Payday loan, title loan, or personal loan(293) --> Consumer Loan(4) , Mortgage(111) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(11) , Vehicle loan or lease(0) , Credit reporting(7) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(7) , Virtual currency(0) , Payday loan(0) , Bank account or service(22) , Checking or savings account(0) , Credit card(10) , Debt collection(121) , \n",
      "Money transfer, virtual currency, or money service(305) --> Consumer Loan(0) , Mortgage(82) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(21) , Vehicle loan or lease(0) , Credit reporting(7) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(0) , Virtual currency(0) , Payday loan(0) , Bank account or service(85) , Checking or savings account(0) , Credit card(7) , Debt collection(103) , \n",
      "Credit reporting, credit repair services, or other personal consumer reports(7255) --> Consumer Loan(21) , Mortgage(1083) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(2110) , Vehicle loan or lease(0) , Credit reporting(1424) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(59) , Virtual currency(0) , Payday loan(0) , Bank account or service(82) , Checking or savings account(0) , Credit card(148) , Debt collection(2328) , \n",
      "Vehicle loan or lease(389) --> Consumer Loan(33) , Mortgage(144) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(37) , Vehicle loan or lease(0) , Credit reporting(8) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(9) , Virtual currency(0) , Payday loan(0) , Bank account or service(16) , Checking or savings account(0) , Credit card(20) , Debt collection(122) , \n",
      "Credit reporting(6313) --> Consumer Loan(26) , Mortgage(879) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(1279) , Vehicle loan or lease(0) , Credit reporting(1779) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(31) , Virtual currency(0) , Payday loan(0) , Bank account or service(57) , Checking or savings account(0) , Credit card(116) , Debt collection(2146) , \n",
      "Prepaid card(281) --> Consumer Loan(3) , Mortgage(76) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(9) , Vehicle loan or lease(0) , Credit reporting(0) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(2) , Virtual currency(0) , Payday loan(0) , Bank account or service(81) , Checking or savings account(0) , Credit card(32) , Debt collection(78) , \n",
      "Other financial service(54) --> Consumer Loan(0) , Mortgage(12) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(5) , Vehicle loan or lease(0) , Credit reporting(2) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(0) , Virtual currency(0) , Payday loan(0) , Bank account or service(9) , Checking or savings account(0) , Credit card(1) , Debt collection(25) , \n",
      "Credit card or prepaid card(1542) --> Consumer Loan(4) , Mortgage(421) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(127) , Vehicle loan or lease(0) , Credit reporting(43) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(6) , Virtual currency(0) , Payday loan(0) , Bank account or service(187) , Checking or savings account(0) , Credit card(297) , Debt collection(457) , \n",
      "Money transfers(292) --> Consumer Loan(0) , Mortgage(88) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(20) , Vehicle loan or lease(0) , Credit reporting(3) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(3) , Virtual currency(0) , Payday loan(0) , Bank account or service(74) , Checking or savings account(0) , Credit card(15) , Debt collection(89) , \n",
      "Student loan(3085) --> Consumer Loan(9) , Mortgage(1250) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(159) , Vehicle loan or lease(0) , Credit reporting(59) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(576) , Virtual currency(0) , Payday loan(0) , Bank account or service(90) , Checking or savings account(0) , Credit card(74) , Debt collection(868) , \n",
      "Virtual currency(2) --> Consumer Loan(0) , Mortgage(0) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(0) , Vehicle loan or lease(0) , Credit reporting(0) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(0) , Virtual currency(0) , Payday loan(0) , Bank account or service(0) , Checking or savings account(0) , Credit card(0) , Debt collection(2) , \n",
      "Payday loan(346) --> Consumer Loan(1) , Mortgage(106) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(20) , Vehicle loan or lease(0) , Credit reporting(4) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(21) , Virtual currency(0) , Payday loan(0) , Bank account or service(24) , Checking or savings account(0) , Credit card(13) , Debt collection(157) , \n",
      "Bank account or service(2972) --> Consumer Loan(6) , Mortgage(801) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(190) , Vehicle loan or lease(0) , Credit reporting(68) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(10) , Virtual currency(0) , Payday loan(0) , Bank account or service(874) , Checking or savings account(0) , Credit card(204) , Debt collection(819) , \n",
      "Checking or savings account(929) --> Consumer Loan(2) , Mortgage(238) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(67) , Vehicle loan or lease(0) , Credit reporting(20) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(1) , Virtual currency(0) , Payday loan(0) , Bank account or service(281) , Checking or savings account(0) , Credit card(55) , Debt collection(265) , \n",
      "Credit card(3753) --> Consumer Loan(9) , Mortgage(970) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(327) , Vehicle loan or lease(0) , Credit reporting(126) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(14) , Virtual currency(0) , Payday loan(0) , Bank account or service(393) , Checking or savings account(0) , Credit card(697) , Debt collection(1217) , \n",
      "Debt collection(11374) --> Consumer Loan(21) , Mortgage(1644) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(803) , Vehicle loan or lease(0) , Credit reporting(633) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(65) , Virtual currency(0) , Payday loan(0) , Bank account or service(209) , Checking or savings account(0) , Credit card(182) , Debt collection(7817) , \n"
     ]
    }
   ],
   "source": [
    "# Make and analyze validation predictions\n",
    "val_predictions = one_hot_to_category(model.predict(x_val),categories)\n",
    "analyze_predictions(categories,df_val['Product'].values,val_predictions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
